package com.zhouheng.springbootmultithreading.tuling.jmm;

/**
 * @author  Fox
 * hsdis-amd64.dll
 * 查看汇编指令
 * -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -Xcomp
 *  DCL为什么要使用volatile
 *
 *  这里会出现一个问题，线程A执行到3.myInstance指向内存空间的地址时，
 *  线程B执行进来发现myInstance不为null就直接返回了，但是此时myInstance还未初始化完成
 */
public class SingletonFactory {

    private static SingletonFactory myInstance;

    public static SingletonFactory getMyInstance() {
        if (myInstance == null) {
            synchronized (SingletonFactory.class) {
                if (myInstance == null) {
                    // 1. 开辟一片内存空间
                    // 3. myInstance指向内存空间的地址（重排序问题）

                    // 2. 对象初始化
                    myInstance = new SingletonFactory();
                }
            }
        }
        return myInstance;
    }

    public static void main(String[] args) {
        SingletonFactory.getMyInstance();
    }
}
